package org.jerrymouse.jsa4j.db.kv;

/**
 * 仓库对象。他代表了一个Key-value数据库。<br/>
 * 这个数据库只有存取两种操作<br/>
 * 这是一个给应用提供的类，对于低层的操作，应该使用@see {@link DB}
 * 
 * 
 * @author yankai
 */
public class Repository {
	/**
	 * perfix like person-profile
	 */
	private String prefix;
	private DB db;

	/**
	 * 构造方法
	 * 
	 * @param prefix
	 *            。Key的前缀，相当于给数据一个“类别”的概念
	 * @param db
	 *            。数据库底层
	 */
	public Repository(String prefix, DB db) {
		super();
		this.prefix = prefix;
		this.db = db;
	}

	/**
	 * 取操作
	 * 
	 * @param key
	 *            键，键会自动链接上前缀，在底层的Key是{prefix}-{key}
	 * @return 值，理论上是一个json对象。当然看你存入的是什么了
	 */
	public String get(String key) {
		return db.get(KeyMaker.linkPrefix(prefix, key));
	}

	/**
	 * 
	 * 存操作。键会自动链接上前缀，在底层的Key是{prefix}-{key}
	 * <ul>
	 * <li>如果Key为null,value也为null,则不操作</li>
	 * <li>如果key为null,value不为null,则自动添加一个主键，执行inerst操作</li>
	 * <li>如果key不为null,且在数据库中存在对应的value, value也为null，执行delete操作</li>
	 * <li>如果key不为null,且在数据库中存在对应的value, value不为null，执行update操作</li>
	 * <li>如果key不为null,但在数据库中不存在对应的value,,value为null,则不操作</li>
	 * <li>如果key不为null,但在数据库中不存在对应的value,,value不为null,<b>执行insert操作</b></li>
	 * </ul>
	 * 
	 * 注意点：提供主键生成机制。
	 * 
	 * @param key
	 *            键
	 * @param value
	 *            一个JSON对象，也可以是别的
	 * @return 刚刚操作的那个对象的key
	 */
	public String put(String key, String value) {
		if (key == null && value != null)
			key = KeyMaker.make();
		if (key == null && value == null)
			return null;
		key = db.put(KeyMaker.linkPrefix(prefix, key), value);
		return KeyMaker.removePrefix(prefix, key);

	}

}
